package chapter02

object Test04_Function2 {
  def main(args: Array[String]): Unit = {
    //函数可以赋值给变量 没有形参
    def f(): Unit = {
      println("函数f")
    }
    //调用了f和f()赋值一致
    val a = f
    println(a)
    //把函数赋值给一个变量
    val b = f _
    println(b)
    b()//b
    //如果有形参的函数
    def f1(a:Int): Int = {
      println("函数f1"+a)
      return 20
    }
    //将函数的返回值赋值给变量
    val c = f1(10)
    println(c)
    //将函数赋值给变量
    val d = f1 _
    println(d(30))

    //函数作为参数传入函数中
    def f3(a: Int, b: Int, f4: (Int, Int) => Int): Int = {
      f4(a, b)
    }
    def f5(a:Int,b:Int):Int={
      a+b
    }
    def f6(a:Int,b:Int):Int={
      a-b
    }
    //调用
    println(f3(20,10,f5))
    println(f3(20,10,f6))
    //将乘法使用匿名函数的方式传入
    f3(20,20,(a:Int,b:Int)=>{a*b})
    //假如类型是可以推断出来的 参数的类型可以省略
    f3(20,20,(a,b)=>{a*b})
    //函数体中只有一句话 大括号可以省略
    f3(20,20,(a,b)=>a*b)
    //如果参数只出现一次 参数可以用下划线代替
    println(f3(20,20,_*_))
  }
}
